<?php

require 'odf.php';

/**
 * Clase extendida de la original para realizar
 * implementaciones especificas de Orfeo.
 *
 * @author Juank 2009-08-08
 *
 */
class Odf_Orfeo extends Odf {

	protected $config = array(
    	'ZIP_PROXY' => 'PhpZipProxy',
    	'DELIMITER_LEFT' => '*',
    	'DELIMITER_RIGHT' => '*'
    	);

    	protected $bodyText;

    	public function __construct($filename, $config = array())
    	{
    		parent::__construct($filename, $config);

    		$this->addStyles();
    		$this->extractBodyText();
    	}

    	/**
    	 * Adiciona styles personales en la cabecera del documento.
    	 *
    	 * @return void
    	 */
    	private function addStyles() {
    		/**
    		 * Adicionar el style para salto de pagina al final del tag de los styles.
    		 */
    		$position = strpos($this->contentXml, "</office:automatic-styles>");
    		$page_break_style = '<style:style style:name="PB" style:family="paragraph" style:parent-style-name="Standard"><style:paragraph-properties fo:break-before="page"/></style:style>';
    		$newstring = substr_replace($this->contentXml, $page_break_style, $position, 0);
    		$this->contentXml = $newstring;
    	}

    	/**
    	 * Extrae el cuerpo del documento.
    	 *
    	 * @return void
    	 */
    	private function extractBodyText() {
    		$begin = strpos($this->contentXml, "<text:p");
    		$end   = strrpos($this->contentXml, "</office:text>", $begin);
    		$this->bodyText = substr( $this->contentXml, $begin, $end - $begin);
    	}

    	/**
    	 * Efectua el reemplazo de las variables del documento por el valor
    	 * correspondiente.
    	 *
    	 * @return void
    	 */
    	private function _parse() {
    		$this->contentXml = str_replace(array_keys($this->vars), array_values($this->vars), $this->contentXml);

    	}

    	/**
    	 * Retorna la posicion final del cuerpo del documento desde donde
    	 * se puede insertar mas contenido.
    	 *
    	 * @return int
    	 */
    	private function getEndBodyInsertPosition() {
    		$position  = strrpos($this->contentXml, "</office:text>");
    		return $position;
    	}

    	/**
    	 * Inserta un texto al final del documento.
    	 * @param $string texto XML con el contenido a insertar.
    	 * @return void
    	 */
    	public function insertAtBodyEnd( $string ) {
    		$position  = $this->getEndBodyInsertPosition();
    		$newstring = substr_replace($this->contentXml, $string, $position, 0);
    		$this->contentXml = $newstring;
    	}

    	/**
    	 * Adiciona un salto de pagina al documento.
    	 *
    	 * @return void
    	 */
    	public function addPageBreak() {
    		/**
    		 * Adicionar salto de pagina en el cuerpo del documento.
    		 */
    		$page_break_body = '<text:p text:style-name="PB"></text:p>';
    		$this->insertAtBodyEnd($page_break_body);
    	}

    	/**
    	 * Retorna el cuerpo del documento en un string XML.
    	 * @return string
    	 */
    	public function getBodyText() {
    		return $this->bodyText;
    	}

    	/**
    	 * Duplica el contenido original del documento.
    	 *
    	 * @return void
    	 */
    	public function duplicateBody() {
    		$this->_parse();
    		$this->insertAtBodyEnd( $this->getBodyText() );
    	}
}
?>